1012. The Best Rank

Direct Link

/*
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

struct stu
{
    string ID;
    int C,M,E,A;
}tmp;

int cmpC(const stu &a, const stu &b)
{
    return a.C > b.C;
}

int cmpM(const stu &a, const stu &b)
{
    return a.M > b.M;
}

int cmpE(const stu &a, const stu &b)
{
    return a.E > b.E;
}

int cmpA(const stu &a, const stu &b)
{
    return a.A > b.A;
}

vector<stu> Log;
map<string, int> Rank;
map<string, string> From;

int main()
{
    int n,k,i;
    while(cin >> n >> k)
    {
        Log.clear();
        Rank.clear();
        From.clear();
        for(i = 0; i < n; i++)
        {
            cin >> tmp.ID >> tmp.C >> tmp.M >> tmp.E;
            tmp.A = (tmp.C + tmp.M + tmp.E)/3;
            Log.push_back(tmp);
        }

        int score = -1;
        int rank = 0;
        sort(Log.begin(), Log.end(), cmpA);

        for(i = 0; i < Log.size(); i++)
        {
            if(Log[i].A != score)
            {
                rank = i+1;
            }
            score = Log[i].A;
            Rank[Log[i].ID] = rank;
            From[Log[i].ID] = 'A';
        }

        score = -1;
        rank = 0;
        sort(Log.begin(), Log.end(), cmpC);
        for(i = 0; i < Log.size(); i++)
        {
            if(Log[i].C != score)
            {
                rank = i+1;
            }
            score= Log[i].C;

            if(Rank[Log[i].ID] > rank)
            {
                Rank[Log[i].ID] = rank;
                From[Log[i].ID] = 'C';
            }

        }

        score = -1;
        rank = 0;
        sort(Log.begin(), Log.end(), cmpM);
        for(i = 0; i < Log.size(); i++)
        {
            if(Log[i].M != score)
            {
                rank = i+1;
            }
            score= Log[i].M;

            if(Rank[Log[i].ID] > rank)
            {
                Rank[Log[i].ID] = rank;
                From[Log[i].ID] = 'M';
            }
        }

        score = -1;
        rank = 0;
        sort(Log.begin(), Log.end(), cmpE);
        for(i = 0; i < Log.size(); i++)
        {
            if(Log[i].E != score)
            {
                rank = i+1;
            }
            score= Log[i].E;

            if(Rank[Log[i].ID] > rank)
            {
                Rank[Log[i].ID] = rank;
                From[Log[i].ID] = 'E';
            }

        }

        string queryID;
        for(i = 0; i < k; i++)
        {
            cin >> queryID;
            if(!Rank.count(queryID))
                cout << "N/A" << endl;
            else
                cout << Rank[queryID] << " " << From[queryID] << endl;
        }
    }
    return 0;
}

*/


#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;

struct stu
{
    string ID;
    int C,M,E,A;
}tmp;

int cmpC(const stu &a, const stu &b)
{
    return a.C > b.C;
}

int cmpM(const stu &a, const stu &b)
{
    return a.M > b.M;
}

int cmpE(const stu &a, const stu &b)
{
    return a.E > b.E;
}

int cmpA(const stu &a, const stu &b)
{
    return a.A > b.A;
}

vector<stu> rankC,rankM,rankE,rankA;

void query(string ID)
{
    string from = "";
    int bestRank = 50000, i;
    for(i = 0; i < rankA.size(); i++)
    {
        if(ID == rankA[i].ID)
        {
            int curGrade = rankA[i].A;
            while(curGrade == rankA[i].A)
            {
                i--;
            }
            if(i+2 < bestRank)
            {
                bestRank = i+2;
                from = "A";
            }
            break;
        }
    }
    for(i = 0; i < rankC.size(); i++)
    {
        if(ID == rankC[i].ID)
        {
            int curGrade = rankC[i].C;
            while(curGrade == rankC[i].C)
            {
                i--;
            }
            if(i+2 < bestRank)
            {
                bestRank = i+2;
                from = "C";
            }
            break;
        }
    }
    for(i = 0; i < rankM.size(); i++)
    {
        if(ID == rankM[i].ID)
        {
            int curGrade = rankM[i].M;
            while(curGrade == rankM[i].M)
            {
                i--;
            }
            if(i+2 < bestRank)
            {
                bestRank = i+2;
                from = "M";
            }
            break;
        }
    }
    for(i = 0; i < rankE.size(); i++)
    {
        if(ID == rankE[i].ID)
        {
            int curGrade = rankE[i].E;
            while(curGrade == rankE[i].E)
            {
                i--;
            }
            if(i+2 < bestRank)
            {
                bestRank = i+2;
                from = "E";
            }
            break;
        }
    }

    if(bestRank == 50000)  cout << "N/A" << endl;
    else                cout << bestRank << " " << from << endl;
}

int main()
{
    int n,k,i;
    while(cin >> n >> k)
    {
        rankC.clear();
        rankM.clear();
        rankE.clear();
        rankA.clear();
        for(i = 0; i < n; i++)
        {
            cin >> tmp.ID >> tmp.C >> tmp.M >> tmp.E;
            tmp.A = (tmp.C + tmp.M + tmp.E)/3;
            rankC.push_back(tmp);
            rankM.push_back(tmp);
            rankE.push_back(tmp);
            rankA.push_back(tmp);
        }
        stable_sort(rankC.begin(), rankC.end(), cmpC);
        stable_sort(rankM.begin(), rankM.end(), cmpM);
        stable_sort(rankE.begin(), rankE.end(), cmpE);
        stable_sort(rankA.begin(), rankA.end(), cmpA);

        string queryID;
        for(i = 0; i < k; i++)
        {
            cin >> queryID;
            query(queryID);
        }
    }
    return 0;
}